import logging
import random
from django_redis import get_redis_connection
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
from verifications import constants


import django
logger = logging.getLogger('django')


class SMSCodeView(APIView):
    def get(self, request, mobile):

        redis_conn = get_redis_connection('verify_codes')
        # 通过前面的配置，获得redis地址，通过这个地址，获得链接对象

        send_flag = redis_conn.get('send_flag_%s'% mobile)
        # 通过链接对象获取这个手机号存在redis里的flag

        if send_flag:
            # 如果取的到，说明在６０秒内，不给重新发
            return Response({'message':'发送短信过于频繁'}, status=status.HTTP_400_BAD_REQUEST)

        sms_code = '%06d'% random.randint(0,999999)
        print(sms_code)
        #　生成６为数字作为短信验证码，前面不够补０

        # 通过redis链接对象，创建redis管道对象
        pl = redis_conn.pipeline()

        # 向管道中添加命令
        pl.setex('sms_%s'% mobile, constants.SMS_CODE_REDIS_EXPIRES,sms_code)
        # 用手机号为键，过期时间，刚刚生成的验证码为值，存到redis里
        pl.setex('send_flag_%s'% mobile, constants.SEND_SMS_CODE_INTERVAL,1)
        # 设置时间标记，用手机号做键，过期时间，值是什么无所谓

        pl.execute()
        # 一次性执行一下

        expires = constants.SMS_CODE_REDIS_EXPIRES//60
        # 换算过期时间,模板用的是分钟？这里把秒换算成分钟

        # 发出发送短信的任务消息
        from celery_tasks.sms.tasks import send_sms_code
        send_sms_code.delay(mobile,sms_code,expires)

        # 返回应答　发送成功
        return Response({'message':'OK'})


